package com.szrt.day20170427;


import static org.junit.Assert.*;

import java.io.File;
import java.lang.reflect.Field;

import org.junit.Test;

public class FieldTest {
	
/*	@Test
	public void commonTest() throws Exception {
		Student student  = new Student();
		student.setStudentAge(33);
		System.out.println(student);
	}*/
	
	
	/**
	 * 1: 使用反射来创建类的对象
	 * Student.class 本身也不能直接干活
	 * 
	 * jvm通过类加载器 加载 Student.class 之后 才能真的干活。  运行时类
	 * 
	 * 没1个运行时的.class文件都是  Class类的对象
	 * 
	 * 熟练掌握
	 * 已知： 字符串格式的类  全路径名  "com.szrt.day20170427.Student"
	 * 求：   new出这个类Student的对象
	 * @throws Exception
	 */
	@Test
	public void reflctionTest() throws Exception {
		
		
		System.out.println("进入主方法...");
		//加载1个类
		Class clazz = Student.class;
		//Class clazz = Class.forName("com.szrt.day20170427.Student");
		
		Object student = clazz.newInstance();
		
		Student  ss = (Student)student;
		
		ss.setStudentAge(33);
		
		System.out.println(ss);
		
		//Student student  = new Student();
	}
	
	
	/**
	 * 2： 使用反射 来  拿到类的属性
	 * @throws Exception
	 */
	@Test
	public void getAttributeTest01() throws Exception {
		//加载1个类   Class类的对象==现实生活中的CT扫描仪 照妖镜  可以知道穿过来的类有哪些方法 属性  注解
		Class clazz = Class.forName("com.szrt.day20170427.Student");
		Object student = clazz.newInstance();
		
		//拿public的属性
		Field[] fields = clazz.getFields();
		
		for(int index =0; index<fields.length;index++){
			//拿到某1个属性
			Field field = fields[index];
			
			//1 属性的名称
			String name  =field.getName();
			System.out.println(name);
			
			//2 属性的类型
			System.out.println(field.getType());
			
			//3 拿到属性的访问修饰符
			System.out.println(field.getModifiers());
			
			//属性的值?
			System.out.println(field.get(student));
			
			
			
			
		}
		
		System.err.println(fields.length);
		
		
		//?如何拿到private的属性?
	}
	
	
	@Test
	public void getAttributeTest02() throws Exception {
		//加载1个类   Class类的对象==现实生活中的CT扫描仪 照妖镜  可以知道穿过来的类有哪些方法 属性  注解
		Class clazz = Class.forName("com.szrt.day20170427.Student");
		
		Student student =(Student) clazz.newInstance();
		
		//?如何拿到private的属性?
		Field[] fields = clazz.getDeclaredFields();
		
		System.out.println("fields.length="+fields.length);
		
		for(int index =0; index<fields.length;index++){
			//拿到某1个属性
			Field field = fields[index];
			
			
			
			
			
			//1 属性的名称
			String name  =field.getName();
			System.out.println(name);
			
			//2 属性的类型
			System.out.println(field.getType());
			
			//3 拿到属性的访问修饰符
			System.err.println(field.getModifiers());
			
			//4 属性的值
			//此处是重点代码  因为这1行代码没有 强制打开访问修饰符   只要打开后所有的方法包括private的方法也可以访问
			field.setAccessible(true);
			
			System.out.println(field.get(student));
			
			
			
			
			
			
		}
		
		
	}
	
	@Test
	public void jinzhi16() throws Exception {
		
		int aa = 0x00000002;
		System.out.println(aa);
		
	}


}
